package com.search.repository;

import com.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 * @Name: ItemRepository
 * @Author: 西风残叶
 * @Date: 2024/8/23 11:17
 * @Version: 1.0
 * @TODO: Repository是Spring家族对持久层出现的类/接口的命名对则
 */
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item, Long> {
    /**
     * 根据标题查询匹配的项目
     *
     * 此方法用于搜索标题中包含指定字符串的所有项目它提供了一种灵活的搜索机制，
     * 允许部分字符串匹配，而不是要求完整的字符串匹配这在只知道项目标题部分信息
     * 时特别有用
     *
     * @param title 要搜索的标题字符串
     * @return 匹配给定标题字符串的项目的Iterable集合
     */
    Iterable<Item> queryItemsByTitleMatches(String title);

    /**
     * 根据标题和品牌查询商品项
     * 此方法通过标题和品牌名称进行筛选，返回匹配的商品项集合
     *
     * @param title 商品的标题，用于匹配商品项的标题
     * @param brand 商品的品牌名称，用于匹配商品项的品牌
     * @return 匹配标题和品牌条件的商品项集合
     */
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(
            String title, String brand);

    /**
     * 根据标题和品牌查询商品，并按价格降序返回
     * 此方法通过标题和品牌部分匹配来搜索商品，提供了一种高效的商品查询方式
     *
     * @param title 商品标题，用于匹配查询
     * @param brand 商品品牌，用于匹配查询
     * @return 按价格降序排列的商品集合，部分匹配标题或品牌的商品
     */
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title,String brand);

    /**
     * 根据标题或品牌关键字查询商品，并按价格降序分页返回结果
     * 此方法主要用于商品搜索和筛选，允许用户通过标题或品牌名称的关键词来查找商品
     * 结果按照价格降序排列，支持分页显示，以便提高用户体验和界面的友好性
     *
     * @param title     商品标题的关键词
     * @param brand     商品品牌名称的关键词
     * @param pageable  分页信息，包含页码、页面大小等信息，用于分页查询
     * @return          按价格降序排序并分页后的商品列表
     */
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);
}